提到物件導向設計(Object-Oriented Programming, OOP),一定會提到它的三大特性,分別是封裝、繼承、多型。此外,還有一個東西,筆者覺得很重要,在實務經常使用,所以一定要特別拿出來討論的就是抽象。
為了產出這篇文章,筆者想了很久,抽象到底是要放到三大特性之中那一個特性呢?如果看倌們去 google 「OO 三大特性」,一定可以找到很多的資料,在這些資料中,有些文章將抽象放到封裝或繼承之中。有些資料則是單獨拿出來說明。
筆者本身比較傾向後者,將抽象視為一個特性,因為封裝、繼承兩個特性,都可以配合抽象一同使用。
常常看到說明物件導向的例子,是使用車子啊、動物啊。筆者來挑戰不一樣的做法,讓我們看故事,懂 OO。
小陳是個超級業務,經常代表公司跟各種客戶周旋。他總是帶著笑臉,面對客戶們各種千奇百怪的要求,總是能夠在公司角度與客戶角度之間,取得平衡點,成功獲得客戶的訂單。
同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。
私底下,對於客戶與公司的種種要求,也是有著滿肚子的苦水,這時,他的妻子就是最好的聽眾,總是靜靜聆聽他的訴苦。
十多年過去了,小陳的兒子也出社會,成為一個業務。在小小陳遇到業務的問題,小陳總是站在後面給他最大的支援,提供自己多年的業務經驗。
朕賜給你的,才是你的﹐朕不給﹐你不能搶。
筆者覺得出上面這句話,真的滿貼切封裝特性。
封裝,就是把想要表現在他人面前的,才表現出來(Public)。不想要讓別人知道的,就通通藏起來(Private, Protected)。
這樣說有點抽象,我們來分析一下上面的故事,學封裝的概念吧。
小陳是個超級業務,經常代表公司跟各種客戶周旋。他總是帶著笑臉,面對客戶們各種千奇百怪的要求,總是能夠在公司角度與客戶角度之間,取得平衡點,成功獲得客戶的訂單。
對業務而言,與客戶溝通、送出估價單、取得訂單,這三個動作就是必要,且公開的行為。
我們把業務視為一個物件時,對客戶這個外部元件而言,業務物件必需提供溝通、取得估價單、下訂單 的功能。
public class 業務
{
public void 溝通(...);
public object 取得估價單();
public void 下訂單(...);
}
而小陳是個業務,所以業務必需會的,小陳必需也要會。
public class 小陳 : 業務
{
public void 溝通(...);
public object 取得估價單();
public void 下訂單(...);
}
同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。
對於指點同事的疑惑。是小陳個人跟同事的公開行為。所以……
public class 小陳 : 業務
{
public void 溝通(...);
public object 取得估價單();
public void 下訂單(...);
public object 指點同事(...);
}
私底下,對於客戶與公司的種種要求,也是有著滿肚子的苦水,這時,他的妻子就是最好的聽眾,總是靜靜聆聽他的訴苦。
因為小陳肚子內的苦水,不可能對客戶或公司內部同事公開,所以這是小陳自己的私下的事情。
public class 小陳 : 業務
{
public void 溝通(...);
public object 取得估價單();
public void 下訂單(...);
public object 指點同事(...);
private object 吐苦水();
}
十多年過去了,小陳的兒子也出社會,成為一個業務。在小小陳遇到業務的問題,小陳總是站在後面給他最大的支援,提供自己多年的業務經驗。
待補上
同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。
待補上
待補上
待補上